/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.domain.proceso.envio.carga;

import com.model.domain.persona.Hogar;
import com.model.domain.persona.HogarXml;
import com.model.domain.usuario.opciones.OpcionTransferenciaEnvio;

/**
 *
 * @author Rdelacruz
 */
public class ReglaEnvioHogar {
    //private Hogar hogarBD;//Tabla Campo_Hogar //Esta en HogarXml
    private HogarXml hogarXml;//Tabla Envios_hogarxmltransferidos. Son los datos XML del Hogar para cargar
        
    private OpcionTransferenciaEnvio[] opcionesPermitidas;
    
    private static final OpcionTransferenciaEnvio[] opciones3 = new OpcionTransferenciaEnvio[]{
        OpcionTransferenciaEnvio.SUBIR_XML_CAMPO, 
        OpcionTransferenciaEnvio.CARGADO_AUTOMATICO, 
        OpcionTransferenciaEnvio.SUBIR_XML_CAMPO_CARGAR_SIN_CONTROL};
    
    private static final OpcionTransferenciaEnvio[] opciones1 = new OpcionTransferenciaEnvio[]{        
        OpcionTransferenciaEnvio.SUBIR_XML_CAMPO_CARGAR_SIN_CONTROL};
    
    public String getMensaje() throws Exception {
        StringBuilder sb = new StringBuilder();
                
        //Log hogar BD:
        String hogarbd = null;
        if(hogarXml.getHogarBD()==null)
            hogarbd = "No existe";
        else
            hogarbd = hogarXml.getHogarBD().getKey()+" res="+hogarXml.getHogarBD().getResultadoFinal();
        sb.append("[Hogar-BD "+hogarbd+"]");
        
        //Log hogar XML:
        sb.append(" [Hogar-XML "+hogarXml.getKeyHogar()+" res="+hogarXml.getResultadoFinalInteger()+"]");

        //Log del estado segun hogarXML y hogarBD:
        sb.append(" [Puede Cargar? ");
        sb.append(puedeCargar() ? "SI": "NO");
        sb.append("]");
        return sb.toString();
    }
    
    public String getMarcaSiContiene(OpcionTransferenciaEnvio opcion) {
        return contiene(opcion) ? "X" : "";
    }
    
    public boolean contiene(OpcionTransferenciaEnvio opcion) {
        for(OpcionTransferenciaEnvio op: opcionesPermitidas) {
            if(opcion==op)
                return true;
        }
        
        return false;
    }     

    /*    
    public String getOpcionesPermitidasString() {
        StringBuilder sb = new StringBuilder();
        for(OpcionEnvio op: opcionesPermitidas) {
            sb.append(op.getNombre());
            sb.append(", ");
        }
        int n = sb.length();
        sb.delete(n-2, n-1);
        return sb.toString();
    }    
    */

    public void procesarOpcionesPermitidas() throws Exception {
        //if(resultado==null)
        //    throw new Exception("Primero debe establecer el resultado de la regla");        
        opcionesPermitidas = puedeCargar()? opciones3 : opciones1;
    }
    
    public boolean puedeCargar() throws Exception {
        Hogar hbd = hogarXml.getHogarBD();
        Integer resHBD = null;
        if(hbd!=null) {
            resHBD = hbd.getResultadoFinal();
            //if(resHBD==null) //ConjuntoReglasEnvioHogar.agregarRegla() genera error
            //    throw new Exception("No se encontró el resultado final del Hogar BD"); 
        }
        return puedeCargar( hogarXml.getResultadoFinalInteger(), resHBD );
    }
    
     /**
     * 
     * @param resultadoFinalBD
     * @param resultadoFinalXML
     * @return true: paso el control; false: no pasó
     */
    private boolean puedeCargar(Integer resultadoFinalXML, Integer resultadoFinalBD) throws Exception {
        if(resultadoFinalXML==null)
            throw new Exception("El resultado final del Hogar XML no debe ser nulo"); 
        
        //PRIMER ENVIO:
        if(resultadoFinalBD==null)
            return true;
        
        //ENVIOS POSTERIORES
        switch(resultadoFinalBD) {
            case 1:
            case 2:
                return false;
            case 3:
            case 4:
                if(resultadoFinalXML==1 || resultadoFinalXML==2) {
                    return true;
                }
                else if(resultadoFinalXML==3 || resultadoFinalXML==4) {
                    return false;
                }                
                return false;
            case 5:
            case 6:
            case 7:
                return false;
        }        
        return false;
    }

    
    //////////////////////////////////////

    public OpcionTransferenciaEnvio[] getOpcionesPermitidas() {
        return opcionesPermitidas;
    }

    public void setOpcionesPermitidas(OpcionTransferenciaEnvio[] opcionesPermitidas) {
        this.opcionesPermitidas = opcionesPermitidas;
    }
   

    public HogarXml getHogarXml() {
        return hogarXml;
    }

    public void setHogarXml(HogarXml hogarXml) {
        this.hogarXml = hogarXml;
    }

}
